package br.com.admGearman.cadastro.negocio;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

import br.com.admGearman.cadastro.vo.EstLojaVo;
import br.com.admGearman.cadastro.vo.LojaVo;
import br.com.admGearman.util.hibernate.business.HibernateUtil;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.hibernate.business.NegocioThrow;
import br.com.r2.util.hibernate.business.R2HbNgc;
import br.com.r2.util.hibernate.business.RestritorHb;

public class LojaNgc extends R2HbNgc<LojaVo>
{

   private Map filtroPropriedade = new HashMap();
   private Map restritores = new HashMap();
   
   private static LojaNgc instancia = null;
   
   public static final int JOIN_EMPRESA = 1;

   public static final int JOIN_EST_LOJA = 2;
   
   private LojaNgc()
   {
      init(restritores, filtroPropriedade, LojaVo.class);
      addFiltro("codigo", RestritorHb.RESTRITOR_IDEQ, "codigo");
      addFiltro("descricao", RestritorHb.RESTRITOR_LIKE, "descricao");
      addFiltro("empresa.codigo", RestritorHb.RESTRITOR_EQ, "estEmpresaVo.codigo");
      addFiltro("estLoja.codigo", RestritorHb.RESTRITOR_EQ, "estLojaVo.codigo");
   }
   
   public static LojaNgc getInstancia()
   {
       if (instancia == null)
       {
           instancia = new LojaNgc();
       }
       return instancia;
   }

   @Override
   protected Map filtroPropriedade()
   {
       return filtroPropriedade;
   }

   @Override
   protected Criteria montaCriteria(Session sessao, int join)
   {
       Criteria criteria = sessao.createCriteria(LojaVo.class);
       if ((join & JOIN_EMPRESA) != 0)
       {
          criteria.createCriteria("estEmpresaVo", "empresa", Criteria.INNER_JOIN);
       }
       if ((join & JOIN_EST_LOJA) != 0)
       {
          criteria.createCriteria("estLojaVo", "estLoja", Criteria.INNER_JOIN);
       }
       return criteria;
   }
   
   @Override
   protected void setarOrdenacao(Criteria criteria, LojaVo filter, int join)
   {
      
      if ((join & JOIN_EMPRESA) != 0)
      {
         criteria.addOrder(Order.asc("empresa.descricao"));
      }
      if ((join & JOIN_EST_LOJA) != 0)
      {
         criteria.addOrder(Order.asc("estLoja.descricao"));
      }
      criteria.addOrder(Order.asc("descricao"));
   }

   @Override
   protected Map restritores()
   {
       return restritores;
   }
   
   @Override
   protected void validarInserir(Session sessao, LojaVo vo) throws R2Exception
   {
      validar(sessao, vo);
   }
   
   @Override
   protected void validarAlterar(Session sessao, LojaVo vo) throws R2Exception
   {
      validar(sessao, vo);
      
      if (vo.getCodigo() == null || !vo.getCodigo().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_codigo" });
      }
   }

   public void validar(Session sessao, LojaVo vo) throws R2Exception
   {
      if (vo == null)
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_loja" });
      }
      if (vo.getEstEmpresaVo() == null || vo.getEstEmpresaVo().getCodigo() == null || !vo.getEstEmpresaVo().getCodigo().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_empresa" });
      }
      if (vo.getEstLojaVo() == null || vo.getEstLojaVo().getCodigo() == null || !vo.getEstLojaVo().getCodigo().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_estabelecimento" });
      }
      if (vo.getDescricao() == null || !vo.getDescricao().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_descricao" });
      }
      if (vo.getNomeEmpresa() == null || vo.getNomeEmpresa().getValor() == null || vo.getNomeEmpresa().getValor().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_empresa" });
      }
   }

   public void alterar(List<LojaVo> listaLojas) throws R2Exception
   {
      Session sessao = HibernateUtil.getSession();
      sessao.setFlushMode(FlushMode.COMMIT);
      Transaction tx = sessao.beginTransaction();
      try
      {
         this.alterar(sessao, listaLojas);
         tx.commit();
      }
      catch (Exception e)
      {
         throw NegocioThrow.getInstancia().catchHBEdicaoSession(e, tx);
      }
      finally
      {
         sessao.close();
      }
   }

   public void alterar(Session sessao, List<LojaVo> listaLojas) throws Exception
   {
      if (listaLojas != null && listaLojas.size() > 0)
      {
         Iterator<LojaVo> iterator = listaLojas.iterator();
         EstLojaVo estLojaVo = null;
         int join = EstLojaNgc.JOIN_EMPRESA;
         while (iterator.hasNext())
         {
            LojaVo element = (LojaVo) iterator.next();
            if (element.getEstLojaNew() != null && element.getEstLojaNew().getValor() > 0)
            {
               estLojaVo = new EstLojaVo();
               estLojaVo.setCodigo(element.getEstLojaNew());
               EstLojaVo estabelecimentoVo = EstLojaNgc.getInstancia().get(sessao, estLojaVo, join);
               element.setEstLojaVo(estabelecimentoVo);
            }
            this.alterar(sessao, element);
            sessao.flush();
         }
      }
   }
}

